<?php

namespace app\api\controller;

use app\common\model\MiniApp;
use app\common\model\Region;
use app\common\model\Users;
use think\facade\Log;
use think\Request;

class Index
{

    public function getAccessToken()
    {
        $miniApp = new MiniApp();
        $token = $miniApp->getAccessToken();
        return $token;
    }

    //接口入口
    public function index()
    {
        header('Access-Control-Allow-Origin:*');

        if (request()->isPost()) {

            //解析请求数据
            $this->parserRequestBody();

            //验证接口版本
            $this->verifyVersion();

//            if (!env('CUSTOMER.DEVELOP_VERSION') && !$this->isEncrypted()) {
//                send_developer_error("请求方式有误！");
//            }

            Log::write('设备类型：'.judge_source());
            Log::write($this->requestData);

            //获取当前模块
            $module = $this->currentModule();

            //接口编码
            $interface = essential_param($this->requestData, "interface");

            //请求数据
            $data = essential_param($this->requestData, "data");

            //执行当前模块
            $response = $module->execModule($interface, $data);

            //输出报文
            if ($this->isEncrypted()) {
                $body = aes_encrypt(json_encode($response, JSON_UNESCAPED_UNICODE));
                die(json_encode(['body' => $body], JSON_UNESCAPED_UNICODE));
            } else {
                die(json_encode($response, JSON_UNESCAPED_UNICODE));
            }
        } else {
            send_developer_error("接口仅支持POST方式请求！");
        }
    }

    /**
     * 解析请求体数据
     */
    private function parserRequestBody()
    {
        //从文件流获取请求数据
        $data = file_get_contents('php://input');

        //判断请求数据是否存在
        if (empty($data)) {
            send_developer_error("请求报文不能为空！");
        }

        //判断是否使用加密
        if ($this->isEncrypted()) {
            //获取加密后的数据
            $data = json_decode($data, true)['body'];
            $data = aes_decrypt($data);
        }

        $data = json_decode($data, true);

        $data = $this->removeIn($data);

        $this->requestData = $data;

    }

    /**
     * 防止注入
     * @param $data
     * @return mixed
     */
    private function removeIn($data){
        foreach ($data as &$item){
            if(is_array($item)){
                $item = $this->removeIn($item);
            }else{
                $item = reInjectThree($item);
            }
        }
        unset($item);

        return $data;
    }

    /**
     * 解析当前模块
     * 必须在解析完版本后调用
     *
     */
    private function currentModule()
    {

        //当前模块名称
        $module = essential_param($this->requestData, "module");

        //版本号
        $version = $this->requestData["version"];

        //判断接口版本是否为当前版本,如果不是,则进行重定向
        if ($version == config('api.current_version')) {
            $m = "app\\api\\module\\" . $module;
        } else {
            //获取指定版本API
            $api = "api_" . str_replace(".", "_", $version);
            $m = "app\\$api\\module\\" . $module;
        }
        //判断模块是否存在
        !class_exists($m) && send_developer_error('模块不存在');
        return new $m();
    }

    /**
     * 解析用户信息
     * 必须在解析完当前模块后执行此操作
     *
     * @param $requestData              请求数据
     */
//    private function parseUser($requestData)
//    {
//        //获取传输的用户字段
//        $user = essential_param($requestData, "user");
//
//        //判断是否需要登录或是否为工具包模块
//        if ($this->module->needLogin($this->interface))
//        {
//            //是否上传user字段
//            if (empty($user))
//            {
//                send_developer_error("未上传用户UID,请核实请求报文内容!");
//            }
//
//            //用户是否存在
//            if (!model("Member")->exists($user))
//            {
//                send_developer_error("UID为" . $user . "的用户不存在,请核实后重试!");
//            }
//        }
//
//        //当前用户UID
//        $this->userUid = $user;
//
//        //验证
//    }

    /**
     * 验证版本号
     */
    private function verifyVersion()
    {
        //读取传入的版本信息
        $version = essential_param($this->requestData, "version");

        //判断接口版本是否有效
        if (!in_array($version, config("api.valid_version"))) {
            send_developer_error("版本为【" . $version . "】的接口不存在!");
        }
    }


    //是否进行加密
    private function isEncrypted()
    {
        //判断是否加密
        if (input('?get.no_encrypt')) {
            return false;
        } else {
            return true;
        }
    }

    //请求体数据
    private $requestData;
}